/*
Problem: 1243D
Date: 21-01-2024 07:36 PM
*/
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e5 + 5;
int n, m, u, v;
set<int> adj[N];
int dsu[N];
int trace(int x) {
return dsu[x] < 0 ? x : dsu[x] = trace(dsu[x]);
}
void join(int x, int y) {
if((x = trace(x)) == (y = trace(y))) return;
if(dsu[x] > dsu[y]) swap(x, y);
dsu[x] += dsu[y];
dsu[y] = x;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
fill(dsu, dsu + n, -1);
for(int i = 0; i < m; i++) {
cin >> u >> v;
u--; v--;
adj[u].insert(v);
adj[v].insert(u);
}
int m = 0;
for(int i = 0; i < n; i++) {
if(adj[i].size() < adj[m].size()) m = i;
}
for(int i = 0; i < n; i++) {
if(adj[m].count(i) == 0) {
join(m, i);
}
}
for(int x : adj[m]) {
for(int i = 0; i < n; i++) {
if(adj[x].count(i) == 0) {
join(x, i);
}
}
}
int cnt = 0;
for(int i = 0; i < n; i++) {
if(dsu[i] < 0) cnt++;
}
cout << (cnt - 1) << endl;
}
1711A - Perfect Permutation | 1701B - Permutation |
1692A - Marathon | 1066A - Vova and Train |
169B - Replacing Digits | 171D - Broken checker |
380C - Sereja and Brackets | 1281B - Azamon Web Services |
1702A - Round Down the Price | 1681C - Double Sort |
12A - Super Agent | 1709A - Three Doors |
1680C - Binary String | 1684B - Z mod X = C |
1003A - Polycarp's Pockets | 1691B - Shoe Shuffling |
1706A - Another String Minimization Problem | 1695B - Circle Game |
1702B - Polycarp Writes a String from Memory | 1701A - Grass Field |
489C - Given Length and Sum of Digits | 886B - Vlad and Cafes |
915A - Garden | 356A - Knight Tournament |
1330A - Dreamoon and Ranking Collection | 1692B - All Distinct |
1156C - Match Points | 1675A - Food for Animals |
1328C - Ternary XOR | 1689A - Lex String |